package com.tutorials.common.utils;

import com.tutorials.common.enums.ResponseStatusEnum;
import lombok.Data;

import java.io.Serializable;

@Data
public class ResponseVO<T> implements Serializable {

    private Integer code;
    private String message;
    private T data;

    public ResponseVO() {
    }

    public ResponseVO(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public ResponseVO(Integer code, T data) {
        this.code = code;
        this.data = data;
    }

    public ResponseVO(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    private ResponseVO(ResponseStatusEnum resultStatus, T data) {
        this.code = resultStatus.getCode();
        this.message = resultStatus.getMessage();
        this.data = data;
    }

    /**
     * 业务成功返回业务代码和描述信息
     *
     * @return 响应统一结构体
     */
    public static ResponseVO<Void> success() {
        return new ResponseVO<Void>(ResponseStatusEnum.SUCCESS, null);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     *
     * @param data 返回的数据
     * @param <T>  泛型
     * @return 响应统一结构体
     */
    public static <T> ResponseVO<T> success(T data) {
        return new ResponseVO<T>(ResponseStatusEnum.SUCCESS, data);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     *
     * @param resultStatus 状态码
     * @param data         返回的数据
     * @param <T>          泛型
     * @return 响应统一结构体
     */
    public static <T> ResponseVO<T> success(ResponseStatusEnum resultStatus, T data) {
        if (resultStatus == null) {
            return success(data);
        }
        return new ResponseVO<T>(resultStatus, data);
    }

    /**
     * 务异常返回业务代码和描述信息
     *
     * @param <T> 泛型
     * @return 响应统一结构体
     */
    public static <T> ResponseVO<T> failure() {
        return new ResponseVO<>(ResponseStatusEnum.SYSTEM_ERROR, null);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     *
     * @param resultStatus 状态码
     * @param <T>          泛型
     * @return 响应统一结构体
     */
    public static <T> ResponseVO<T> failure(ResponseStatusEnum resultStatus) {
        return failure(resultStatus, null);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     *
     * @param resultStatus 状态码
     * @param data         返回的数据
     * @param <T>          泛型
     * @return 响应统一结构体
     */
    public static <T> ResponseVO<T> failure(ResponseStatusEnum resultStatus, T data) {
        if (resultStatus == null) {
            return new ResponseVO<>(ResponseStatusEnum.SYSTEM_ERROR, null);
        }
        return new ResponseVO<>(resultStatus, data);
    }

    public static <T> ResponseVO<T> failure(Integer code, String message) {
        return new ResponseVO<>(code, message);
    }
}